perm filename MIXDPY[MIX,SYS] blob sn#020814 filedate 1972-02-04 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00004 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002		This page contains the dpy picture apparatus.
 00008 00003		This section has all the display facilities, including
 00016 00004		If the PDP address of the word to be displayed is
 00019 ENDMK
⊗;
COMMENT	⊗	This page contains the dpy picture apparatus.
	⊗

XMAX ←←	777
XMIN ←←	-777
YMAX ←← 600
YMIN ←← -200

WIDTH ←← =60
HEIGHT ←← =90
BTWEEN ←← =40

DPYHED:	DPYPIC
	ENDAD-.

DEFINE	LVW	(X,Y,M,T)
{	X1 ←←	(X)⊗31 ∧ 3777B10
	Y1 ←←	(Y)⊗16 ∧ 3777B21
	X1 ∨ Y1 ∨ M⊗6 ∨ T⊗4 ∨ 6
}

DEFINE	LVWBS	(X,Y,M,T,B,S)
{	X1 ←←	(X)⊗31 ∧ 3777B10
	Y1 ←←	(Y)⊗16 ∧ 3777B21
	X1 ∨ Y1 ∨ B⊗11 ∨ S⊗8 ∨ M⊗6 ∨ T⊗4 ∨ 6
}

DEFINE	RETURN	(N)
{	LVW	N*-=12,-30,0,2
}

DEFINE	DPYREG
	{ASCID	/+ 00 00 00 00 00    /
}
DEFINE  DPHREG
	{ASCID	/+ 000000 0000       /
}
DEFINE	DPYDAT
	{ASCID	/000000000000   /
}
DEFINE	DPYAD
	{ASCID	/0000 /
}
DEFINE DD1 &(A) {↓DDLB&A:}
DEFINE DD2 &(A) {↓DDSZ&A←←.-DDLB&A}

DPYPIC:	0
	LVW	XMIN,YMAX,1,2
	LVW	XMAX,YMAX,1,0
	LVW	XMAX,YMIN,1,0
	LVW	XMIN,YMIN,1,0
	LVW	XMIN,YMAX,1,0

	LVW	BTWEEN,-BTWEEN-HEIGHT,0,2
	LVW	0,HEIGHT,0,0
	LVW	WIDTH/2,-HEIGHT/2,0,0
	LVW	WIDTH/2,HEIGHT/2,0,0
	LVW	0,-HEIGHT,0,0

	LVW	BTWEEN,0,0,2
	LVW	0,HEIGHT,0,0

	LVW	BTWEEN,-HEIGHT,0,2
	LVW	WIDTH,HEIGHT,0,0
	LVW	-WIDTH,0,0,2
	LVW	WIDTH,-HEIGHT,0,0

	LVW	XMAX-4*BTWEEN-3*WIDTH,YMAX-BTWEEN-HEIGHT,1,2
	LVW	0,HEIGHT,0,0

	LVW	BTWEEN,0,0,2
	LVW	WIDTH,0,0,0
	LVW	0,-HEIGHT,0,0
	LVW	-WIDTH,0,0,0
	LVW	0,HEIGHT,0,0

	LVW	WIDTH+BTWEEN,0,0,2
	LVW	WIDTH,0,0,0
	LVW	0,-HEIGHT,0,0
	LVW	-WIDTH,0,0,0
	LVW	0,HEIGHT,0,0

	LVW	WIDTH+BTWEEN,0,0,2
	LVW	WIDTH,0,0,0
	LVW	0,-HEIGHT,0,0
	LVW	-WIDTH,0,0,0
	LVW	WIDTH,HEIGHT/2,0,2
	LVW	-WIDTH,0,0,0
	LVW	0,HEIGHT/2,0,0

	LVW    	XMIN+BTWEEN,250,1,2

DD1(12)
	ASCID	/rA : /
DPYRA:	DPYREG
DD2(12)
	RETURN	=25

DD1(13)
	ASCID	/rX : /
DPYRX:	DPYREG
DD2(13)
	RETURN	=25

DD1(14)
	ASCID	/ri1: /
DPYRI1:	DPHREG
DD2(14)
	RETURN	=25

DD1(15)
	ASCID	/ri2: /
DPYRI2:	DPHREG
DD2(15)
	RETURN	=25

DD1(16)
	ASCID	/ri3: /
DPYRI3:	DPHREG
DD2(16)
	RETURN	=25

DD1(17)
	ASCID	/ri4: /
DPYRI4:	DPHREG
DD2(17)
	RETURN	=25

DD1(20)
	ASCID	/ri5: /
DPYRI5:	DPHREG
DD2(20)
	RETURN	=25
DD1(21)
	ASCID	/ri6: /
DPYRI6:	DPHREG
DD2(21)
	RETURN	=25

DD1(11)
	ASCID	/rJ : /
DPYRJ:	DPHREG
DD2(11)

	LVW	0,250,1,2

DD1(1)
	ASCID	/EXECUTE TIME = /
DPYXT:	DPYREG
DD2(1)
	RETURN	=35

DD1(2)
	ASCID	/PROGRAM COUNTER   = /
DPYPC:	DPYAD
DD2(2)
	RETURN	=25

DD1(3)
	ASCID	/INS: /
DPYIN:	DPYREG
DD2(3)
	RETURN	=25

	RETURN	0

DD1(5)
DPYOV:	ASCID	/     OVERFLOW  /
DD2(5)
	RETURN	=15
	RETURN	0

DD1(6)
DPYG:	ASCID	/     GREATER   /
DD2(6)
	RETURN	=15

DD1(7)
DPYE:	ASCID	/   → EQUAL/
DD2(7)
	RETURN	=10

DD1(10)
DPYL:	ASCID	/     LESS /
DD2(10)


ENDAD:	XWD	DPYPIC, 20
COMMENT	⊗	This section has all the display facilities, including
		all the handy-dandy, neat little pictures.
	⊗

UPDAD:	0
UPD0:	1
UPD1:	1

OPDEF	UPDATE	[PUSHJ  P, .]
	SKIPE	DDSW		;ARE WE ON A DD?
	JRST	.+5		;YES
	MOVNI	10, 1
	GETLIN	10
	SKIPL	10
	POPJ	P,
	MOVE	10, UPD0
	MOVEM	10, UPD1
INDS:	MOVE	10, DPYOFF
	TLNE	FLAGS, OVFLAG
	MOVE	10, DPYON
	MOVEM	10, DPYOV
	MOVE	10, DPYOFF
	TLNE	FLAGS, GFLAG
	MOVE	10, DPYON
	MOVEM	10, DPYG
	MOVE	10, DPYOFF
	TLNE	FLAGS, EFLAG
	MOVE	10, DPYON
	MOVEM	10, DPYE
	MOVE	10, DPYOFF
	TLNE	FLAGS, LFLAG
	MOVE	10, DPYON
	MOVEM	10, DPYL
REGS:	MOVEI	10, REGLST			; INIT ADDRESS COUNTER
	MOVEM	10, UPDAD
	SKIPN	10, @UPDAD			; 0 → NO MORE
	JRST	DATS
	MOVE	10, (10)			; 10 ← SOURCE WORD
	MOVE	12, [POINT  7, REGBLK]		; POINTER TO DESTINATION BLOCK
	MOVE	13, [POINT  3, 10, 5]		; POINTER TO SOURCE
	MOVEI	11, "+"				; FIRST DO SIGN BIT
	SKIPGE	10
	ADDI	11, 2				; CHANGE TO "-"
	IDPB	11, 12
	IBP	12				; SPACE
	ILDB	11, 13				; FIRST DIGIT OF PAIR
	ADDI	11, 60
	IDPB	11, 12
	ILDB	11, 13				; SECOND DIGIT OF PAIR
	ADDI	11, 60
	IDPB	11, 12
	TLNE	13, 770000			; ANY MORE PAIRS?
	JRST	.-10				; YES
	HLRZ	10, @UPDAD			; PREPARE FOR TRANSFER TO DPY AREA
	MOVE	11, REGBLK
	MOVEM	11, (10)			; NOW DO TRANSFER
	AOJ	10,
	MOVE	11, REGBLK+1
	MOVEM	11, (10)
	AOJ	10,
	MOVE	11, REGBLK+2
	MOVEM	11, (10)
	AOJ	10,
	MOVE	11, REGBLK+3
	MOVEM	11, (10)
	AOS	UPDAD				; GET NEXT REGISTER
	JRST	REGS+2
DATS:	MOVEI	10, DATLST			; INIT ADDRESS COUNTER
	MOVEM	10, UPDAD
	SKIPN	10, @UPDAD			; 0 → NO MORE
	JRST	ADS
	MOVE	10, (10)			; 10 ← SOURCE WORD
	MOVE	12, [POINT  7, DATBLK]		; POINTER TO DESTINATION BLOCK
	MOVE	13, [POINT  3, 10]		; POINTER TO SOURCE
	ILDB	11, 13
	ADDI	11, 60
	IDPB	11, 12
	TLNE	13, 770000			; ANY MORE PAIRS?
	JRST	.-4				; YES
	HLRZ	10, @UPDAD			; PREPARE FOR TRANSFER TO DPY AREA
	MOVE	11, DATBLK
	MOVEM	11, (10)			; NOW DO TRANSFER
	AOJ	10,
	MOVE	11, DATBLK+1
	MOVEM	11, (10)
	AOJ	10,
	MOVE	11, DATBLK+2
	MOVEM	11, (10)
	AOS	UPDAD				; GET NEXT REGISTER
	JRST	DATS+2
ADS:	MOVEI	11, ADLST			; INIT ADDRESS COUNTER
	MOVEM	11, UPDAD
	SKIPN	11, @UPDAD
	JRST	BYTES
	HRRZ	12, (11)			; 12 ← SOURCE WORD
	SUBI	12, MC0000
	MOVE	13, [POINT  7, ADBLK]		; POINTER TO DESTINATION BLOCK
	MOVEI	10, =1000			; 10 WILL HOLD DIVISOR
	MOVE	11, 12				; SET UP FOR DIVIDE
	IDIV	11, 10				; GET DIGIT
	ADDI	11, 60
	IDPB	11, 13
	IDIVI	10, =10				; FIX DIVISOR
	JUMPG	10, .-5
	HLRZ	10, @UPDAD			; PREPARE FOR TRANSFER TO DYP AREA
	MOVE	11, ADBLK
	MOVEM	11, (10)			; NOW DO TRANSFER
	AOS	UPDAD				; GET NEXT REGISTER
	JRST	ADS+2
BYTES:	MOVEI	10, BYTLST			; INIT ADDRESS COUNTER
	MOVEM	10, UPDAD
	SKIPN	10, @UPDAD			; 0 → NO MORE
	JRST	DPYOUT				;GO WRITE SCREEN (III OR DD)
	HRRZ	11, @UPDAD			; UPMEM ← SOURCE ADDRESS
	MOVEM	11, UPMEM
	MOVEI	13, BYTDES-BYTLST		; UPBYTE ← GROUP DESCRIPTOR
	ADD	13, UPDAD
	MOVE	12, (13)
	MOVEM	12, UPBYTE
	MOVNI	12, 4				; UPBTIM ← COUNTER FOR GROUP #
	MOVEM	12, UPBTIM
	MOVE	13, [XWD  DPYMDL, DPYWRK]	; SET UP WORK AREA
	BLT	13, DPYWRK-DPYMDL+DPYWRK-1
	MOVE	13, [POINT  7, DPYWRK]		; AND POINTER
	MOVEM	13, UPOINT
	MOVEI	13, "+"				; GET SIGN
	SKIPGE	@UPMEM
	MOVEI	13, "-"
	IDPB	13, UPOINT
	IBP	UPOINT
NXTGRP:	MOVE	13, UPBYTE			; 13 ← 5*n+i
	IMULI	13, 5
	ADD	13, UPBTIM
	SKIPN	DPYPTR+4(13)
	JRST	ALLDON				; 0 → ALL DONE
	LDB	12, DPYPTR+4(13)		; GET BYTE GROUP
	MOVE	10, DPYDIV+4(13)		; 10 ← DIVISOR
	MOVE	11, 12
	IDIV	11, 10
	ADDI	11, 60
	IDPB	11, UPOINT			; PUT DIGIT INTO WORK AREA
	IDIVI	10, =10				; NEXT DIVISOR
	JUMPG	10, .-5				; BACK FOR MORE DIGITS
	IBP	UPOINT				; SPACE AFTER GROUP
	AOSG	UPBTIM				; MORE GROUPS?
	JRST	NXTGRP				; YES
ALLDON:	MOVEI	13, 3
	HLRZ	10, @UPDAD
	HRRM	10, .+2
	MOVE	11, DPYWRK(13)
	MOVEM	11, 0(13)
	SOJGE	13, .-2
	AOS	UPDAD
	JRST	BYTES+2


DPYOUT:	SKIPE	DDSW		;IS THIS A DATA DISK
	JRST	DDUPD		;YES, UPDATE SCREEN (DDUPD DOES A POPJ)
	UPGIOT	DPYHED		;REWRITE III SCREEN
	POPJ	P,




DPYOFF:	ASCID	/     /
DPYON:	ASCID	/   → /

REGLST:	0
REGBLK:	DPYREG

DATLST:	0
DATBLK:	DPYDAT

ADLST:	XWD	DPYPC, PC
	0
ADBLK:	DPYAD

BYTLST:	XWD	DPYIN, INSTR
	XWD	DPYRA, RA
	XWD	DPYRX, RX
	XWD	DPYRI1, R1
	XWD	DPYRI2, R2
	XWD	DPYRI3, R3
	XWD	DPYRI4, R4
	XWD	DPYRI5, R5
	XWD	DPYRI6, R6
	XWD	DPYRJ, RJ
	XWD	DPYXT, EXTIME
	0
BYTDES:	7
	17
	17
	2
	2
	2
	2
	2
	2
	2
	0
	0
UPMEM:	0
UPBTIM:	0
UPOINT:	0
UPBYTE:	0
DPYMDL:	ASCID	/                    /
DPYWRK:	ASCID	/                    /



QUPDAT:	MOVNI	10, 1				; IS IT A DPY
	GETLIN	10
	JUMPGE	10, .+3				; NO → DON'T UPDATE
	PGSEL	0				; PICK PIECE OF GLASS
	UPDATE
	JRST	BUTTON

COMMENT	⊗	If the PDP address of the word to be displayed is
		in UPMEM then the following tables can be used to
		get the appropriate byte groups for updating the
		display.

			n = a 4-bit number, where bit k is on if
				byte k in the MIX word should begin
				a new grouping.  (e.g.  standard
				instruction format is:
					n=7   or   + AA I F C)

			i = the # of the group which you wish to use (1≤i≤5)

			DPYPTR+5*n+i-1   is a byte pointer to the right bytes
					 or 0 if no bytes left

			DPYDIv+5*n+i-1   contains the divisor to start finding
					 the digits with
	⊗


ULIST1
DPYPTR:	FOR I←0,17
 {ULIST2
  X1←←X2←←X3←←X4←←X5←←6
  Y1←←=11
  Y2←←=17
  Y3←←=23
  Y4←←=29
  Y5←←=35
  Z←←1


  FOR @$ J←3,0,-1
   {IFE I∧1⊗J,
     {FOR @! K←Z,Z
       {X!K←←X!K+6
        Y!K←←Y!K+6
       ⎇
      FOR @! K←Z+1,4
       {FOR @% K1←K+1,K+1
         {X!K←←X%K1
          Y!K←←Y%K1
         ⎇
       ⎇
     ⎇
    IFN I∧1⊗J,	{Z←←Z+1⎇
   ⎇


  FOR @$ J←1,Z
   {	POINT  X$J, @UPMEM, Y$J
   ⎇
  FOR J←Z+1,5
   {	0
   ⎇
 ⎇
LIST

ULIST1
DPYDIV:	FOR I←0,17
 {ULIST2
  X1←←X2←←X3←←X4←←X5←←6
  Z←←1


  FOR @$ J←3,0,-1
   {IFE I∧1⊗J,
     {FOR @! K←Z,Z
       {X!K←←X!K+6
       ⎇
      FOR @! K←Z+1,4
       {FOR @% K1←K+1,K+1
         {X!K←←X%K1
         ⎇
       ⎇
     ⎇
    IFN I∧1⊗J,	{Z←←Z+1⎇
   ⎇


  FOR @$ J←1,5
   {D←←1
    FOR K←1,X$J/3-1
     {D←←=10*D
     }
	D
   }
 }
LIST